AspectJ提供了以下通知参数进行传递:
通知参数 |
描述 |
适用 |
JoinPoint |
表示正在执行的业务方法,相当于放射中的method 提供访问当前被通知方法的目标对象、代理对象、方法参数等数据 使用必须是多参数中的第一个 |
@Aspect @AfterReturning @AfterThrowing @After |
ProceedingJoinPoint |
用于环绕通知,继承于JoinPoint,替代JoinPoint proceed()方法用于执行目标方法 若目标有返回值,则该方法的返回值就是目标方法的返回值 |
@Around |
JoinPoint.StaticPart |
提供访问连接点的静态部分,如被通知方法签名、连接点类型等 |
@Aspect @AfterReturning @AfterThrowing @After |
注
- @AfterThrowing 可以使用JoinPoint参数,也可以省略,但必须有接受错误参数类型的参数
使用JoinPoint获取
Spring AOP提供使用org.aspectj.lang.JoinPoint类型获取连接点数据,任何通知方法的第一个参数 都可以是JoinPoint
(环绕通知是ProceedingJoinPoint,JoinPoint子类),当然第一个参数位置也可以是JoinPoint.StaticPart类型,这个只返回连接点的静态部分
方法 |
类型 |
描述 |
toString() |
String |
连接点所在位置的相关信息 |
toShortString() |
String |
连接点所在位置的简短相关信息 |
toLongString() |
String |
连接点所在位置的全部相关信息 |
getThis() |
Object |
返回AOP代理对象 |
getTarget() |
Object |
返回目标对象 |
getArgs() |
Object[] |
返回被通知方法参数列表 |
getSignature() |
Signature |
返回当前连接点签名 |
getSourceLocation() |
SourceLocation |
返回连接点方法所在类文件中的位置 |
getKind() |
String |
连接点类型 |
getStaticPart() |
StaticPart |
返回连接点静态部分 |
示例
@Before("pointCut()")
public void doBefore(JoinPoint joinPoint) {
// 获取签名
Signature signature = joinPoint.getSignature();
// 获取切入的包名
String declaringTypeName = signature.getDeclaringTypeName();
// 获取即将执行的方法名
String funcName = signature.getName();
// 也可以用来记录一些信息,比如获取请求的 URL 和 IP
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 获取请求 URL
String url = request.getRequestURL().toString();
// 获取请求 IP
String ip = request.getRemoteAddr();
}
示例
@AfterThrowing(pointcut = "pointCut()", throwing = "ex")
public void afterThrowing(Throwable ex) {
Signature signature = joinPoint.getSignature();
String method = signature.getName();
log.info("执行方法{}出错,异常为:{}", method, ex);
}
示例
@AfterThrowing(pointcut = "pointCut()", throwing = "ex")
public void afterThrowing(JoinPoint joinPoint, Throwable ex) {
Signature signature = joinPoint.getSignature();
String method = signature.getName();
}
使用ProceedingJoinPoint获取
用于环绕通知,使用proceed()方法来执行目标方法
示例
@Around("permissionCheck()")
public Object permissionCheck(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("===================开始增强处理===================");
//获取请求参数,详见接口类
Object[] objects = joinPoint.getArgs();
Long id = ((JSONObject) objects[0]).getLong("id");
String name = ((JSONObject) objects[0]).getString("name");
System.out.println("id1->>>>>>>>>>>>>>>>>>>>>>" + id);
System.out.println("name1->>>>>>>>>>>>>>>>>>>>>>" + name);
// 修改入参
JSONObject object = new JSONObject();
object.put("id", 8);
object.put("name", "lisi");
objects[0] = object;
// 将修改后的参数传入,joinPoint.proceed()为目标对象执行原结果
return joinPoint.proceed(objects);
}
使用JoinPoint.StaticPart获取
提供访问连接点的静态部分,如被通知方法签名、连接点类型等
方法 |
类型 |
描述 |
getSignature() |
Signature |
返回当前连接点签名 |
getKind() |
String |
连接点类型 |
getId() |
int |
唯一标识 |
toString() |
String |
连接点所在位置的相关信息 |
toShortString() |
String |
连接点所在位置的简短相关信息 |
toLongString() |
String |
连接点所在位置的全部相关信息 |